struct ListNode* swapPairs(struct ListNode* head)
{
    if(head ==NULL || head -> next ==NULL)
    {
        return head;
    }
 
    //创建虚拟头节点
    struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
    dummy->next = head;
 
    //pre是即将交换的两个节点的前结点
    struct ListNode* pre = dummy;
    //first seconde 是结点交换前的第一第二个结点(1st -> 2st) ==> (2st -> 1st)
    struct ListNode* first = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* second = (struct ListNode*)malloc(sizeof(struct ListNode));
 
    while(head && head->next){ //注意这里还要判断第二个结点是否存在，因为会对第二个节点的next进行操作，不存在就会null pointer
        first = head;
        second = head->next;
 
        //两节点交换 并将交换后的第一个结点与前驱链接
        first->next = second->next;
        second->next = first;
        pre->next = second; //将链表前驱 与交换后的第一个结点链接
 
        pre = first; //pre继续新位置的前结点，即本轮交换后的第二个结点位置(就是交换前的first)
        head = pre->next; //head就是下一轮交换的前一个
    }
 
    return dummy->next;
}
